package com.spzx.user;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.spzx.common.core.web.controller.BaseController;
import com.spzx.common.core.web.domain.BaseEntity;

/**
 * MyBatis-Plus 代码生成器
 * 用于根据数据库表结构，自动生成相应的 Domain, Mapper, Service, Controller 等代码。
 * 代码生成器是一个“逆向工程”工具，通过读取已存在的数据库表结构，来自动生成与之对应的、标准化的后端代码。
 */
public class GenMP {

    public static void main(String[] args) {
        // 1. 创建代码生成器对象，并连接数据库
        //    通过 .create() 方法传入数据库连接信息，用于读取表结构元数据。
        FastAutoGenerator.create("jdbc:mysql://192.168.12.130:3306/spzx-user?characterEncoding=utf-8&useSSL=false", "root", "191151084")

                // 2. 全局配置 (GlobalConfig)
                .globalConfig(builder -> builder
                                // 设置作者名，会生成在所有类文件的 Javadoc 注释中
                                .author("gax")
                                // 设置代码的输出目录，请使用绝对路径
                                .outputDir("D:/spzx/user")
                                // 设置日期类型的映射策略。ONLY_DATE 表示使用 java.util.Date 类型
                                .dateType(DateType.ONLY_DATE)
                        // .disableOpenDir() // (可选) 生成完成后不自动打开输出目录
                        // .enableSwagger()  // (可选) 开启 Swagger 模式，实体类会添加 @ApiModel 注解
                )

                // 3. 包名配置 (PackageConfig)
                .packageConfig(builder -> builder
                        // 设置父包名，所有生成的类都会在这个包下
                        .parent("com.spzx.user")
                        // 设置各层模块的包名
                        .entity("domain")       // Entity/Domain 类 (如 UserInfo.java) -> com.spzx.user.domain
                        .mapper("mapper")       // Mapper 接口 (如 UserInfoMapper.java) -> com.spzx.user.mapper
                        .xml("mapper")          // Mapper XML 文件 (如 UserInfoMapper.xml) -> resources/mapper/
                        .service("service")     // Service 接口 (如 IUserInfoService.java) -> com.spzx.user.service
                        .serviceImpl("service.impl") // Service 实现类 (如 UserInfoServiceImpl.java) -> com.spzx.user.service.impl
                        .controller("controller")  // Controller 类 (如 UserInfoController.java) -> com.spzx.user.controller
                )

                // 4. 生成策略配置 (StrategyConfig)
                .strategyConfig(builder -> builder
                        // 设置需要生成代码的表名，可以传入多个表名
                        .addInclude(
                                "region",
                                "user_address",
                                "user_browse_history",
                                "user_collect",
                                "user_info")

                        // 4.1. 实体类 (Entity) 生成策略
                        .entityBuilder()
                        .enableLombok() // 开启 Lombok，生成的实体类会带上 @Data 等注解
                        .superClass(BaseEntity.class) // 设置实体类的父类
                        .addSuperEntityColumns( // 添加父类中的公共字段
                                // 这里列出的字段，在生成实体类时会被忽略，因为它们已经存在于父类 BaseEntity 中了
                                "id", "create_by", "create_time", "update_by", "update_time", "remark", "del_flag"
                        )
                        //.addIgnoreColumns("is_deleted") // (可选) 忽略表中的某些字段，不生成对应的属性
                        .enableFileOverride() // 开启文件覆盖，如果文件已存在，则直接覆盖

                        // 4.2. Service 层生成策略
                        .serviceBuilder()
                        //.formatServiceFileName("I%sService") // (可选) 格式化 Service 接口的名称，例如 IUserInfoService
                        .enableFileOverride() // 开启文件覆盖

                        // 4.3. Controller 层生成策略
                        .controllerBuilder()
                        .superClass(BaseController.class) // 设置 Controller 的父类
                        .enableRestStyle() // 开启 @RestController 注解
                        .enableFileOverride() // 开启文件覆盖
                )

                // 5. 模板引擎配置 (TemplateEngine)
                //    推荐使用 Freemarker，功能更强大
                .templateEngine(new FreemarkerTemplateEngine())

                // 6. 执行生成
                .execute();
    }
}